package br.unp.tasi.loja.repositorios.impl;

import br.unp.tasi.loja.entidades.ItemPedido;
import br.unp.tasi.loja.entidades.Pedido;
import br.unp.tasi.loja.entidades.Produto;
import br.unp.tasi.loja.entidades.Usuario;
import br.unp.tasi.loja.repositorios.RepositorioPedido;
import br.unp.tasi.loja.repositorios.RepositorioProduto;
import java.util.List;
import javax.inject.Inject;

import javax.inject.Named;
import javax.persistence.NoResultException;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Repository;

@Repository
@Named("br.unp.tasi.loja.repositorios.RepositorioPedido")
public class RepositorioPedidoImpl extends RepositorioBasicolmpl implements RepositorioPedido {

  private transient final Log log = LogFactory.getLog(RepositorioPedidoImpl.class);
  @Inject
  RepositorioProduto repositorioProduto;

  @Override
  @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
  public Pedido localizarPedidoAberto(Usuario usuario) {
    Pedido pedido = null;
    try {
      pedido = (Pedido) getEntityManager().
              createQuery("from Pedido p "
              + "left join fetch p.itens i "
              + "left join fetch i.produto prod "
              + "left join fetch prod.categoria c "
              + "where p.usuario.id = :usuario_id "
              + "and p.status = 0").
              setParameter("usuario_id", usuario.getId()).
              getSingleResult();
    } catch (NoResultException e) {
      log.info("\nNenhum pedido com o status aberto encontrado. Um novo sera criado");
      log.info("\nUsuario ID: " + usuario.getId());
      pedido = new Pedido();
      pedido.setUsuario(usuario);
      gravar(pedido);
    }
    return pedido;
  }

  @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
  @Override
  public void adicionarItem(Usuario usuario, Long produto_id, Long quantidade) {
    Pedido pedido = localizarPedidoAberto(usuario);
    Produto produto = repositorioProduto.localizarPeloID(produto_id);
    ItemPedido itemPedido = new ItemPedido();
    itemPedido.setProduto(produto);
    itemPedido.setQuantidade(quantidade);
    itemPedido.setPedido(pedido);
    pedido.getItens().add(itemPedido);
  }

  @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
  @Override
  public void removerItemPedido(Pedido pedido, Long idItemPedido) {
    ItemPedido encontrado = null;
    List<ItemPedido> itens = pedido.getItens();
    for (ItemPedido item : itens) {
      if (item.getId().equals(idItemPedido)) {
        encontrado = item;
      }
    }
    if (encontrado != null) {
      itens.remove(encontrado);
      apagar(encontrado);
    }
  }

  public List<Pedido> localizarPedidosAnteriores(Usuario usuario) {
    return getEntityManager().
            createQuery("from Pedido p "
            //+ "left join fetch p.itens i "
            //+ "left join fetch i.produto prod "
            //+ "left join fetch prod.categoria c "
            + "where p.usuario.id = :usuario_id "
            + "and p.status <> 0").
            setParameter("usuario_id", usuario.getId()).getResultList();
  }
}
